/*
Copyright (C) 2011 The University of Michigan
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Please send inquiries to powertutor@umich.edu
*/
package vn.cybersoft.obs.andriod.batterystats2.phone;
import vn.cybersoft.obs.andriod.batterystats2.components.Sensors;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorManager;
public class DreamConstants implements PhoneConstants {
protected static final String OPER_TMOBILE = "T - Mobile";
protected static final String OPER_ATT = "AT&T";
/* TODO: Figure out if this is really appropriate or how we should convert
* the sensor power ratings (in mA) to mW. I'm not sure we'll try to model
* these thing's power usage but for the developer it's definitely interesting
* to get some (perhaps rough?) idea of how much power sensors are using.
*/
protected double BATTERY_VOLTAGE = 3.7;
public DreamConstants(Context context) {
SensorManager sensorManager = (SensorManager)context.getSystemService(
Context.SENSOR_SERVICE);
sensorPowerArray = new double[Sensors.MAX_SENSORS];
for(int i = 0; i < Sensors.MAX_SENSORS; i++) {
Sensor sensor = sensorManager.getDefaultSensor(i);
if(sensor != null) {
sensorPowerArray[i] = sensor.getPower() * BATTERY_VOLTAGE;
}
}
}
public String modelName() {
return "dream";
}
public double maxPower() {
return 2800;
}
public double lcdBrightness() {
return 2.40276;
}
public double lcdBacklight() {
return 121.4606 + 166.5;
}
public double oledBasePower() {
throw new RuntimeException("oledBasePower() called on device with no " +
"OLED display");
}
public double[] oledChannelPower() {
throw new RuntimeException("oledChannelPower() called on device with no " +
"OLED display");
}
public double oledModulation() {
throw new RuntimeException("oledModulation() called on device with no " +
"OLED display");
}
private static final double[] arrayCpuPowerRatios = {3.4169, 4.3388};
public double[] cpuPowerRatios() {
return arrayCpuPowerRatios;
}
private static final double[] arrayCpuFreqs = {245.36, 383.38};
public double[] cpuFreqs() {
return arrayCpuFreqs;
}
public double audioPower() {
return 384.62;
}
private static final double[] arrayGpsStatePower = {0.0, 173.55, 429.55};
public double[] gpsStatePower() {
return arrayGpsStatePower;
}
public double gpsSleepTime() {
return 6.0;
}
public double wifiLowPower() {
return 38.554;
}
public double wifiHighPower() {
return 720;
}
public double wifiLowHighTransition() {
return 15;
}
public double wifiHighLowTransition() {
return 8;
}
private static final double[] arrayWifiLinkRatios = {
47.122645, 46.354821, 43.667437, 43.283525, 40.980053, 39.44422, 38.676581,
34.069637, 29.462693, 20.248805, 11.034917, 6.427122
};
public double[] wifiLinkRatios() {
return arrayWifiLinkRatios;
}
private static final double[] arrayWifiLinkSpeeds = {
1, 2, 5.5, 6, 9, 11, 12, 18, 24, 36, 48, 54
};
public double[] wifiLinkSpeeds() {
return arrayWifiLinkSpeeds;
}
public String threegInterface() {
return "rmnet0";
}
public double threegIdlePower(String oper) {
if(OPER_TMOBILE.equals(oper)) {
return 10;
}
return 10;
}
public double threegFachPower(String oper) {
if(OPER_TMOBILE.equals(oper)) {
return 401;
}
return 401;
}
public double threegDchPower(String oper) {
if(OPER_TMOBILE.equals(oper)) {
return 570;
}
return 570;
}
public int threegDchFachDelay(String oper) {
if(OPER_TMOBILE.equals(oper)) {
return 6;
} else if(OPER_ATT.equals(oper)) {
return 5;
}
return 4;
}
public int threegFachIdleDelay(String oper) {
if(OPER_TMOBILE.equals(oper)) {
return 4;
} else if(OPER_ATT.equals(oper)) {
return 12;
}
return 6;
}
public int threegUplinkQueue(String oper) {
return 151;
}
public int threegDownlinkQueue(String oper) {
return 119;
}
private double[] sensorPowerArray;
public double[] sensorPower() {
return sensorPowerArray;
}
public double getMaxPower(String componentName) {
if("LCD".equals(componentName)) {
return lcdBacklight() + lcdBrightness() * 255;
} else if("CPU".equals(componentName)) {
double[] ratios = cpuPowerRatios();
return ratios[ratios.length - 1] * 100;
} else if("Audio".equals(componentName)) {
return audioPower();
} else if("GPS".equals(componentName)) {
double[] gpsPow = gpsStatePower();
return gpsPow[gpsPow.length - 1];
} else if("Wifi".equals(componentName)) {
// TODO: Get a better estimation going here.
return 800;
} else if("3G".equals(componentName)) {
return threegDchPower("");
} else if("Sensors".equals(componentName)) {
double res = 0;
for(double x : sensorPower()) res += x;
return res;
} else {
return 900;
}
}
}